package com.cjc.express.controller;


import com.cjc.express.entity.*;
import com.cjc.express.exception.ValidationException;
import com.cjc.express.service.UserService;
import com.cjc.express.utils.ExpressUtils;
import com.github.pagehelper.Page;
import com.google.gson.JsonObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;

//import org.apache.catalina.servlet4preview.http.HttpServletRequest;

/**
 * ====================
 * Created with intellij IDEA
 * 创建者：杜一平
 * 日期：2017/1/19（星期五）
 * 时间：08：00
 * 说明：该类是快递中心用户控制层，主要用于接收用户查询操作，反馈相关查询信息
 */

@RestController
@CrossOrigin
@Api(description = "用户模块")
@RequestMapping(value = "/user")
public class UserController extends BaseController {
    // 自动装配用户服务层，向服务层提交操作请求
    @Autowired
    private UserService userService;

    // 实例化价格表JSON对象
    private PriceJsons priceJsons = new PriceJsons(1000, "操作成功");

    // 实例化公司表JSON对象
    private CompanyJsons companyJsons = new CompanyJsons(1000, "查找成功");

    // 日志配置
    private final static Logger logger = LoggerFactory.getLogger(UserController.class);

    /**
     * 查询所有公司记录
     *
     * @return CompanyJsons 公司json组合
     */
    @ApiOperation(value = "查询所有公司表",notes = "无参数")
    @RequestMapping(value = "/allCompanyList", method = RequestMethod.POST)
    @ResponseBody
    public CompanyJsons listallcompany() {
        try {
            // 获取所有公司
            List<Company> companies = userService.listallcompany();
            CompanyJsons companyJsons = new CompanyJsons(1000, "查询成功", companies);
            return companyJsons;
        } catch (ValidationException r) {
            companyJsons.setStatus(1001);
            companyJsons.setMessage(r.getMessage());
            companyJsons.setResult(null);
            return companyJsons;
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticCompanyJsons.companyJsons2;
        }
    }

    /**
     * 查询所有报价表控制方法
     *
     * @return PriceJsons 报价表json组合
     */
    @ApiOperation(value = "查询所有报价表")
    @RequestMapping(value = "/allPriceList", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons listallprice(HttpServletRequest request) {
        try {
            // 获取json对象
            JsonObject jsonObject = getJsonObject(request);
            // 设置可能不传递参数解决形式
            int pageNum = jsonObject.has("pageNum")
                    ? jsonObject.get("pageNum").getAsInt() : 1;
            int pageSize = jsonObject.has("pageSize")
                    ? jsonObject.get("pageSize").getAsInt() : 10;
            // 获取
            Page<Price> prices = userService.selectAllPrice(pageNum, pageSize);
            PriceJsons priceJsons = new PriceJsons(1000, "查询成功", prices);
            return priceJsons;
        } catch (ValidationException r) {
            priceJsons.setStatus(1001);
            priceJsons.setMessage(r.getMessage());
            priceJsons.setResult(null);
            return priceJsons;
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }

    /**
     * 用于输入收件地，返回同一收件地不同公司的报价表
     *
     * @param request http请求
     * @return PriceJsons 报价表json组合
     */
    @ApiOperation(value = "依据收件地查询报价表", notes = "pageNum pageSize")
    @RequestMapping(value = "/priceListDest", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons listdest(HttpServletRequest request) throws IOException {
        try {
            // 获取json对象
            JsonObject jsonObject = getJsonObject(request);
            // 获取相应字段
            String dest = jsonObject.get("dest").getAsString().trim();
            List<Price> page = userService.selectByDest(dest);
            PriceJsons priceJsons = new PriceJsons(1000, "查询成功", page);
            return priceJsons;
        } catch (ValidationException r) {
            return new PriceJsons(1001, r.getMessage());
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }

    /**
     * 用于输入公司，返回同一公司不同收件地的报价表
     *
     * @param request http请求
     * @return List<Price> 返回同一公司不同收件地的报价表
     */
    @ApiOperation(value = "依据快递公司查询报价表", notes = "companyname pageNum pageSize")
    @RequestMapping(value = "priceListCompany", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons listcompany(HttpServletRequest request) {
        try {
            // 获取json对象
            JsonObject jsonObject = getJsonObject(request);
            // 获取相应字段
            String companyname = jsonObject.get("companyname").getAsString().trim();

            List<Price> page = userService.selectByCompany(companyname);
            PriceJsons priceJsons = new PriceJsons(1000, "查询成功", page);
            return priceJsons;
        } catch (ValidationException r) {
            return new PriceJsons(1001, r.getMessage());
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }

    /**
     * 统计用户使用次数
     *
     * @return PriceJsons 报价表json组合
     */
    @ApiOperation(value = "统计用户使用次数,输入用户id调用", notes = "id")
    @RequestMapping(value = "userTimes", method = RequestMethod.POST)
    @ResponseBody
    public PriceJsons userTimes(HttpServletRequest request) {
        try {
            // 获取json对象
            JsonObject jsonObject = getJsonObject(request);
            // 获取相应字段
            String id = jsonObject.get("id").getAsString().trim();
            Times times = new Times();
            times.setId(id);
            userService.updatePlus(times);
            return StaticPriceJsons.priceJsons0;
        } catch (ValidationException r) {
            PriceJsons priceJsons = new PriceJsons(1001, r.getMessage());
            return priceJsons;
        } catch (Exception e) {
            logger.info("出现错误："+e.getMessage());
            return StaticPriceJsons.priceJsons2;
        }
    }


}
